import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.util.List;

/**
 * 预定管理面板
 * 
 * 这个面板是酒店管理系统中的预定管理模块
 * 负责显示、查询和管理所有的房间预定记录
 * 
 * 主要功能：
 * 1. 显示所有预定记录的列表
 * 2. 提供预定记录的搜索功能
 * 3. 支持新增房间预定
 * 4. 实时刷新预定数据
 * 
 * 界面组成：
 * - 顶部：标题和操作按钮（新增预定、刷新）
 * - 中部：搜索栏（按客人姓名、预定号、房间号搜索）
 * - 底部：预定记录表格（显示所有预定信息）
 * 
 * 与其他模块的关系：
 * - 调用ReservationDialog进行新增预定
 * - 通过DataManager读取预定数据
 * - 与Room、Guest等数据模型交互
 * 
 * 技术特点：
 * - 使用JTable显示表格数据
 * - 实现实时搜索过滤
 * - 统一的UI主题风格
 * - 响应式布局设计
 */
public class ReservationPanel extends JPanel {

    // ==================== 界面组件 ====================

    /**
     * 预定记录表格
     * 
     * 使用JTable组件显示所有的预定记录
     * 表格包含：预定号、客人姓名、房间号、入住日期、退房日期、总金额、状态
     */
    private JTable reservationTable;

    /**
     * 表格数据模型
     * 
     * DefaultTableModel是JTable的数据模型，用于管理表格中的数据
     * 通过这个模型可以添加、删除、修改表格中的行和列
     */
    private DefaultTableModel tableModel;

    /**
     * 搜索输入框
     * 
     * 用户可以在这个输入框中输入关键词来搜索预定记录
     * 支持按客人姓名、预定号、房间号进行模糊搜索
     */
    private JTextField searchField;

    /**
     * 构造方法 - 创建预定管理面板
     * 
     * 初始化界面组件并加载数据
     * 调用顺序：先设置界面，再刷新数据
     */
    public ReservationPanel() {
        // 设置用户界面
        setupUI();

        // 刷新数据，加载所有预定记录
        refreshData();
    }

    /**
     * 设置用户界面
     * 
     * 创建和布局所有的界面组件
     * 使用BorderLayout布局：顶部是操作面板，中央是表格面板
     */
    private void setupUI() {
        // 设置面板的布局管理器为BorderLayout
        // BorderLayout将容器分为5个区域：NORTH、SOUTH、EAST、WEST、CENTER
        setLayout(new BorderLayout());

        // 设置面板背景色为白色，保持界面简洁
        setBackground(Color.WHITE);

        // 设置面板边距：上下左右各20像素的空白边距
        // EmptyBorder创建一个空的边框，用于增加组件周围的空白空间
        setBorder(new EmptyBorder(20, 20, 20, 20));

        // 创建顶部面板（包含标题、按钮和搜索栏）
        JPanel topPanel = createTopPanel();
        // 将顶部面板添加到BorderLayout的北部区域
        add(topPanel, BorderLayout.NORTH);

        // 创建表格面板（显示预定记录）
        JPanel tablePanel = createTablePanel();
        // 将表格面板添加到BorderLayout的中央区域
        // 中央区域会占据剩余的所有空间
        add(tablePanel, BorderLayout.CENTER);
    }

    /**
     * 创建顶部面板
     * 
     * 顶部面板包含三个部分：
     * 1. 左侧：标题"预定管理"
     * 2. 右侧：操作按钮（新增预定、刷新）
     * 3. 底部：搜索栏
     * 
     * @return 创建的顶部面板
     */
    private JPanel createTopPanel() {
        // 创建主面板，使用BorderLayout布局
        JPanel panel = new JPanel(new BorderLayout());
        panel.setBackground(Color.WHITE);
        // 设置底部边距，与表格面板保持间距
        panel.setBorder(new EmptyBorder(0, 0, 20, 0));

        // ==================== 标题区域 ====================
        JLabel titleLabel = new JLabel("预定管理");
        // 设置标题字体：微软雅黑、粗体、18号字
        titleLabel.setFont(new Font("微软雅黑", Font.BOLD, 18));
        // 设置标题颜色为系统主色调
        titleLabel.setForeground(HotelManagementSystem.getPrimaryColor());
        // 将标题放在面板的西侧（左侧）
        panel.add(titleLabel, BorderLayout.WEST);

        // ==================== 操作按钮区域 ====================
        // 创建按钮面板，使用FlowLayout右对齐
        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        buttonPanel.setBackground(Color.WHITE);

        // 新增预定按钮
        JButton addReservationButton = createStyledButton("新增预定", HotelManagementSystem.getSuccessColor());
        // 添加点击事件：点击时显示预定对话框
        addReservationButton.addActionListener(e -> showAddReservationDialog());
        buttonPanel.add(addReservationButton);

        // 刷新按钮
        JButton refreshButton = createStyledButton("刷新", HotelManagementSystem.getSecondaryColor());
        // 添加点击事件：点击时刷新数据
        refreshButton.addActionListener(e -> refreshData());
        buttonPanel.add(refreshButton);

        // 将按钮面板放在主面板的东侧（右侧）
        panel.add(buttonPanel, BorderLayout.EAST);

        // ==================== 搜索区域 ====================
        // 创建搜索面板，使用FlowLayout左对齐
        JPanel searchPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        searchPanel.setBackground(Color.WHITE);

        // 搜索标签
        JLabel searchLabel = new JLabel("搜索预定:");
        searchLabel.setFont(HotelManagementSystem.getButtonFont());
        searchPanel.add(searchLabel);

        // 搜索输入框
        searchField = new JTextField(15);
        searchField.setFont(HotelManagementSystem.getButtonFont());
        searchPanel.add(searchField);

        // 搜索按钮
        JButton searchButton = createStyledButton("搜索", HotelManagementSystem.getPrimaryColor());
        // 添加点击事件：点击时执行搜索
        searchButton.addActionListener(e -> searchReservation());
        searchPanel.add(searchButton);

        // 将搜索面板放在主面板的南侧（底部）
        panel.add(searchPanel, BorderLayout.SOUTH);

        return panel;
    }

    private JPanel createTablePanel() {
        JPanel panel = new JPanel(new BorderLayout());
        panel.setBackground(Color.WHITE);

        // 表格标题
        JLabel tableTitle = new JLabel("预定记录");
        tableTitle.setFont(new Font("微软雅黑", Font.BOLD, 16));
        tableTitle.setForeground(HotelManagementSystem.getPrimaryColor());
        tableTitle.setBorder(new EmptyBorder(0, 0, 10, 0));
        panel.add(tableTitle, BorderLayout.NORTH);

        // 创建表格
        String[] columnNames = { "预定号", "客人姓名", "房间号", "入住日期", "退房日期", "总金额", "状态" };
        tableModel = new DefaultTableModel(columnNames, 0) {
            @Override
            public boolean isCellEditable(int row, int column) {
                return false;
            }
        };

        reservationTable = new JTable(tableModel);
        reservationTable.setFont(new Font("微软雅黑", Font.PLAIN, 14));
        reservationTable.setRowHeight(30);
        reservationTable.getTableHeader().setFont(new Font("微软雅黑", Font.BOLD, 14));
        reservationTable.getTableHeader().setBackground(HotelManagementSystem.getBackgroundColor());
        reservationTable.setSelectionBackground(HotelManagementSystem.getSecondaryColor().brighter());

        JScrollPane scrollPane = new JScrollPane(reservationTable);
        panel.add(scrollPane, BorderLayout.CENTER);

        return panel;
    }

    private JButton createStyledButton(String text, Color backgroundColor) {
        JButton button = new JButton(text);
        button.setFont(HotelManagementSystem.getButtonFont());
        button.setBackground(backgroundColor);
        button.setForeground(Color.WHITE);
        button.setBorder(new EmptyBorder(8, 15, 8, 15));
        button.setFocusPainted(false);
        button.setCursor(new Cursor(Cursor.HAND_CURSOR));

        // 添加鼠标悬停效果
        button.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                button.setBackground(backgroundColor.darker());
            }

            public void mouseExited(java.awt.event.MouseEvent evt) {
                button.setBackground(backgroundColor);
            }
        });

        return button;
    }

    private void showAddReservationDialog() {
        // 创建预定对话框
        JFrame parentFrame = (JFrame) SwingUtilities.getWindowAncestor(this);
        ReservationDialog dialog = new ReservationDialog(parentFrame);
        dialog.setVisible(true);

        // 如果用户确认了预定，刷新数据
        if (dialog.isConfirmed()) {
            refreshData();
        }
    }

    private void searchReservation() {
        String keyword = searchField.getText().trim();
        if (keyword.isEmpty()) {
            refreshData();
            return;
        }

        List<Reservation> allReservations = DataManager.getInstance().getAllReservations();
        tableModel.setRowCount(0);

        for (Reservation reservation : allReservations) {
            if (reservation.getGuestName().contains(keyword) ||
                    reservation.getReservationId().contains(keyword) ||
                    reservation.getRoomNumber().contains(keyword)) {
                Object[] rowData = {
                        reservation.getReservationId(),
                        reservation.getGuestName(),
                        reservation.getRoomNumber(),
                        reservation.getCheckInDate(),
                        reservation.getCheckOutDate(),
                        "¥" + reservation.getTotalAmount(),
                        reservation.getStatus()
                };
                tableModel.addRow(rowData);
            }
        }
    }

    public void refreshData() {
        List<Reservation> reservations = DataManager.getInstance().getAllReservations();

        // 清空表格
        tableModel.setRowCount(0);

        // 填充表格数据
        for (Reservation reservation : reservations) {
            Object[] rowData = {
                    reservation.getReservationId(),
                    reservation.getGuestName(),
                    reservation.getRoomNumber(),
                    reservation.getCheckInDate(),
                    reservation.getCheckOutDate(),
                    "¥" + reservation.getTotalAmount(),
                    reservation.getStatus()
            };
            tableModel.addRow(rowData);
        }

        // 清空搜索框
        searchField.setText("");
    }
}